package com.zeratul.common.event.core.handler.local;

import com.zeratul.common.core.utils.spring.SpringUtils;
import com.zeratul.common.event.base.BasePublishHandler;
import com.zeratul.common.event.domain.ZtEvent;

/**
 * 基于Spring事件发布实现的处理器
 */
public class SpringEventPublishHandler implements BasePublishHandler {

    /**
     * 序列化事件对象，本地消息发送无需序列化
     *
     * @param ztEvent
     */
    @Override
    public <T> byte[] serialize(ZtEvent<T> ztEvent) {
        return null;
    }

    /**
     * 执行事件发送
     *
     * @param ztEvent    - 事件对象
     * @param eventBytes - 事件对象序列化后的字节数组
     */
    @Override
    public <T> void doSendEvent(ZtEvent<T> ztEvent, byte[] eventBytes) {
        try {
            //发布事件消息
            SpringUtils.publishEvent(new ZtApplicationEvent<>(this, ztEvent));
            //事件发布回调
            sendCallback(ztEvent, null);
        } catch (Exception e) {
            //事件发布回调
            sendCallback(ztEvent, e);
        }
    }
}
